home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 16 / CU Amiga Magazine's Super CD-ROM 16 (1997-10-16)(EMAP Images)(GB)[!][issue 1997-11].iso / CUCD / Graphics / Ghostscript / source / gdevpccm.c < prev    next >
C/C++ Source or Header  |  1995-05-17  |  5KB  |  174 lines

  1. /* Copyright (C) 1992, 1993 Aladdin Enterprises.  All rights reserved.
  2.   
  3.   This file is part of Aladdin Ghostscript.
  4.   
  5.   Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  6.   or distributor accepts any responsibility for the consequences of using it,
  7.   or for whether it serves any particular purpose or works at all, unless he
  8.   or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  9.   License (the "License") for full details.
  10.   
  11.   Every copy of Aladdin Ghostscript must include a copy of the License,
  12.   normally in a plain ASCII text file named PUBLIC.  The License grants you
  13.   the right to copy, modify and redistribute Aladdin Ghostscript, but only
  14.   under certain conditions described in the License.  Among other things, the
  15.   License requires that the copyright notice and this notice be preserved on
  16.   all copies.
  17. */
  18.  
  19. /* gdevpccm.c */
  20. /* Support routines for PC color mapping */
  21. #include "gx.h"
  22. #include "gsmatrix.h"            /* for gxdevice.h */
  23. #include "gxdevice.h"
  24. #include "gdevpccm.h"            /* interface */
  25.  
  26. /* Color mapping routines for EGA/VGA-style color. */
  27. /* Colors are 4 bits: 8=intensity, 4=R, 2=G, 1=B. */
  28.  
  29. /* Define the color spectrum */
  30. #define v_black 0
  31. #define v_blue 1
  32. #define v_green 2
  33. #define v_cyan 3
  34. #define v_red 4
  35. #define v_magenta 5
  36. #define v_brown 6
  37. #define v_white 7
  38. #define v_dgray 8            /* dark gray is not very usable */
  39. #define v_lblue 9
  40. #define v_lgreen 10
  41. #define v_lcyan 11
  42. #define v_lred 12
  43. #define v_lmagenta 13
  44. #define v_yellow 14
  45. #define v_bwhite 15
  46.  
  47. /* ------ EGA/VGA (4-bit) color mapping ------ */
  48.  
  49. gx_color_index
  50. pc_4bit_map_rgb_color(gx_device *dev, gx_color_value r, gx_color_value g,
  51.   gx_color_value b)
  52. {
  53. #define Nb gx_color_value_bits
  54.     static const byte grays[4] = { v_black, v_dgray, v_white, v_bwhite };
  55. #define tab3(v0,v1,v23) { v0, v1, v23, v23 }
  56.     static const byte g0r0[4] = tab3(v_black,v_blue,v_lblue);
  57.     static const byte g0r1[4] = tab3(v_red,v_magenta,v_lmagenta);
  58.     static const byte g0r2[4] = tab3(v_lred,v_lmagenta,v_lmagenta);
  59.     static const byte _ds *g0[4] = tab3(g0r0, g0r1, g0r2);
  60.     static const byte g1r0[4] = tab3(v_green,v_cyan,v_lcyan);
  61.     static const byte g1r1[4] = tab3(v_brown,v_white,v_lcyan);
  62.     static const byte g1r2[4] = tab3(v_yellow,v_lred,v_lmagenta);
  63.     static const byte _ds *g1[4] = tab3(g1r0, g1r1, g1r2);
  64.     static const byte g2r0[4] = tab3(v_lgreen,v_lgreen,v_lcyan);
  65.     static const byte g2r1[4] = tab3(v_lgreen,v_lgreen,v_lcyan);
  66.     static const byte g2r2[4] = tab3(v_yellow,v_yellow,v_bwhite);
  67.     static const byte _ds *g2[4] = tab3(g2r0, g2r1, g2r2);
  68.     static const byte _ds * _ds *ga[4] = tab3(g0, g1, g2);
  69. #undef tab3
  70. #define q4mask (-1 << (Nb - 2))
  71.     if ( !((r ^ g) & q4mask) && !((g ^ b) & q4mask) )    /* gray */
  72. #undef q4mask
  73.         return (gx_color_index)grays[r >> (Nb - 2)];
  74.     else
  75. #define q3cv(v) ((v - (v >> 2)) >> (Nb - 2))
  76.         return (gx_color_index)ga[q3cv(g)][q3cv(r)][q3cv(b)];
  77. #undef q3cv
  78. #undef Nb
  79. }
  80. int
  81. pc_4bit_map_color_rgb(gx_device *dev, gx_color_index color,
  82.   gx_color_value prgb[3])
  83. {
  84. #define icolor (int)color
  85.     gx_color_value one;
  86.     switch ( icolor )
  87.     {
  88.     case v_white:            /* "dark white" */
  89.         prgb[0] = prgb[1] = prgb[2] =
  90.           gx_max_color_value - (gx_max_color_value / 3);
  91.         return 0;
  92.     case v_dgray:
  93.         prgb[0] = prgb[1] = prgb[2] = gx_max_color_value / 3;
  94.         return 0;
  95.     }
  96.     one = (icolor & 8 ? gx_max_color_value : gx_max_color_value / 2);
  97.     prgb[0] = (icolor & 4 ? one : 0);
  98.     prgb[1] = (icolor & 2 ? one : 0);
  99.     prgb[2] = (icolor & 1 ? one : 0);
  100.     return 0;
  101. #undef icolor
  102. }
  103.  
  104. /* ------ SVGA 8-bit color mapping ------ */
  105.  
  106. /*
  107.  * For 8-bit color, we use a fixed palette with approximately
  108.  * 3 bits of R, 3 bits of G, and 2 bits of B.
  109.  * We have to trade off even spacing of colors along each axis
  110.  * against the desire to have real gray shades;
  111.  * we compromise by using a 7x7x5 "cube" with extra gray shades
  112.  * (1/6, 1/3, 2/3, and 5/6), instead of the obvious 8x8x4.
  113.  */
  114.  
  115. gx_color_index
  116. pc_8bit_map_rgb_color(gx_device *dev, gx_color_value r, gx_color_value g,
  117.   gx_color_value b)
  118. {    uint rv = r / (gx_max_color_value / 7 + 1);
  119.     uint gv = g / (gx_max_color_value / 7 + 1);
  120.     return (gx_color_index)
  121.         (rv == gv && gv == b / (gx_max_color_value / 7 + 1) ?
  122.          rv + (256-7) :
  123.          (rv * 7 + gv) * 5 + b / (gx_max_color_value / 5 + 1));
  124. }
  125. int
  126. pc_8bit_map_color_rgb(gx_device *dev, gx_color_index color,
  127.   gx_color_value prgb[3])
  128. {    static const gx_color_value ramp7[8] =
  129.     {    0,
  130.         gx_max_color_value / 6,
  131.         gx_max_color_value / 3,
  132.         gx_max_color_value / 2,
  133.         gx_max_color_value - (gx_max_color_value / 3),
  134.         gx_max_color_value - (gx_max_color_value / 6),
  135.         gx_max_color_value,
  136.         /* The 8th entry is not actually ever used, */
  137.         /* except to fill out the palette. */
  138.         gx_max_color_value
  139.     };
  140.     static const gx_color_value ramp5[5] =
  141.     {    0,
  142.         gx_max_color_value / 4,
  143.         gx_max_color_value / 2,
  144.         gx_max_color_value - (gx_max_color_value / 4),
  145.         gx_max_color_value
  146.     };
  147. #define icolor (uint)color
  148.     if ( icolor >= 256-7 )
  149.     {    prgb[0] = prgb[1] = prgb[2] = ramp7[icolor - (256-7)];
  150.     }
  151.     else
  152.     {    prgb[0] = ramp7[icolor / 35];
  153.         prgb[1] = ramp7[(icolor / 5) % 7];
  154.         prgb[2] = ramp5[icolor % 5];
  155.     }
  156. #undef icolor
  157.     return 0;
  158. }
  159.  
  160. /* Write a palette on a file. */
  161. int
  162. pc_write_palette(gx_device *dev, uint max_index, FILE *file)
  163. {    uint i, c;
  164.     gx_color_value rgb[3];
  165.     for ( i = 0; i < max_index; i++ )
  166.     {    (*dev_proc(dev, map_color_rgb))(dev, (gx_color_index)i, rgb);
  167.         for ( c = 0; c < 3; c++ )
  168.         {    byte b = rgb[c] >> (gx_color_value_bits - 8);
  169.             fputc(b, file);
  170.         }
  171.     }
  172.     return 0;
  173. }
  174.